package proyecto;

// @ Copyright 
// Ingeniero Juan Jos� Puello Fuentes.
import java.io.*;
public class Lista  <T> implements Serializable{
	private Nodo inicio;
	private Nodo anterior;
	private Nodo <T> actual;
	private Nodo fin;
	public Lista(){
		inicio = null;
		anterior = null;
		actual = null;
		fin = null;
	}

	public boolean vacia(){return inicio == null;}
	public boolean fin(){return actual == null;}
	public boolean inicio(){return actual == inicio;}
	
	public void insertarInicio(T dato,String pro,String nom, String clave){
		if(vacia()){
			inicio = new Nodo(dato,pro,nom, clave);
			fin = inicio;
		}else{
			inicio = new Nodo(dato,pro,nom, clave, inicio);
		}
	}
	
	public void insertarFin(T dato,String pro,String nom, String clave){
		if(vacia()){
			insertarInicio(dato,pro,nom, clave);
		}else{
			fin.setSig(new Nodo(dato,pro,nom, clave));
			fin = fin.getSig();
		}
	}
	
	public void reiniciar(){actual = inicio;}
	
	public T infor(){
		if(!fin())
		   return actual.getDato();
		else
		   return null;
	}	      					
	
	public void siguiente(){
		if(!fin())
			actual = actual.getSig();
	}
	
	public T buscar(String clave){
		T dato = null;
		if(!vacia()){
			reiniciar();
			while(!fin() && clave.compareTo(actual.getClave())!=0){
				anterior = actual;
				actual = actual.getSig();
			}
			if(!fin())
			   dato = actual.getDato();
		}
		return dato;
	}
        public T buscarNom(String Nombre){
		T dato = null;
		if(!vacia()){
			reiniciar();
			while(!fin() && Nombre.compareTo(actual.getClavenom())!=0){
				anterior = actual;
				actual = actual.getSig();
			}
			if(!fin())
			   dato = actual.getDato();
		}
		return dato;
	}
        public T buscarProfe(String Profesion){
		T dato = null;
		if(!vacia()){
			reiniciar();
			while(!fin() && Profesion.compareTo(actual.getClaveprofe())!=0){
				anterior = actual;
				actual = actual.getSig();
			}
			if(!fin())
			   dato = actual.getDato();
		}
		return dato;
	}
	
	public void eliminarInicio(){
		if(!vacia()){
			if(inicio != fin)
				inicio = inicio.getSig();
			else
				inicio = fin = null;	 
		}			
	}
	
	public void eliminarFin(){
		if(!vacia()){
			if(inicio != fin){
				while(actual != fin){
					anterior = actual;
					actual = actual.getSig();
				}	
				anterior.setSig(null);
				fin = anterior;	
			}else{
				inicio = fin = null;
			}		 
		}			
	}
	
	public void eliminar(){
		if(!vacia()){
			if(!fin()){
				if(inicio != fin){
					if(!inicio()){
					    anterior.setSig(actual.getSig());
					    if(actual == fin)
					    	fin = anterior;
					}else{
						eliminarInicio();
					}    
				}else{
					inicio = fin = null;	 
				}
			}			
		}			
	}
	

	public void insertarInicio(T dato, String clave,String clavenom,String clavePro, String orden){
		if(vacia()){
			inicio = new Nodo(dato,clavePro,clavenom,clave, orden);
			fin = inicio;
		}else{
			inicio = new Nodo(dato,clavePro,clavenom, clave, orden, inicio);
		}
	}
        public void insertarInicio(T dato, String clave,String clavenom,String clavePro, double orden){
		if(vacia()){
			inicio = new Nodo(dato,clavePro,clavenom,clave, orden,null);
			fin = inicio;
		}else{
			inicio = new Nodo(dato,clavePro,clavenom, clave, orden, inicio);
		}
	}
	
	public void insertarFin(T dato,String clavepro,String clavenom, String clave, String orden){
		if(vacia()){
			insertarInicio(dato,clavepro,clavenom, clave, orden);
		}else{
			fin.setSig(new Nodo(dato, clavepro,clavenom,clave, orden));
			fin = fin.getSig();
		}
	}
        public void insertarFin(T dato,String clavepro,String clavenom, String clave, Double orden){
	if(vacia()){
			insertarInicio(dato,clavepro,clavenom, clave, orden);
		}else{
			fin.setSig(new Nodo(dato, clavepro,clavenom,clave, orden,null));
			fin = fin.getSig();
		}
	}
	public void insertarAntes(T dato, String clavepro,String clavenom,String clave, String orden){
		if(!vacia()){
			if(!fin()){
				if(!inicio()){
				    anterior.setSig(new Nodo(dato, clave, actual));
				}else{
					insertarInicio(dato,clavepro,clavenom, clave, orden);
				}    
			}			
		}else
			System.out.println("Error, no hay datos para insertar antes..!");			
	}
public void insertarAntes(T dato, String clavepro,String clavenom,String clave, double orden){
		if(!vacia()){
			if(!fin()){
				if(!inicio()){
				    anterior.setSig(new Nodo(dato, clave, actual));
				}else{
					insertarInicio(dato,clavepro,clavenom, clave, orden);
				}
			}
		}else
			System.out.println("Error, no hay datos para insertar antes..!");
	}
	public void insertarDespues(T dato, String clave, String orden){
		if(!vacia()){
			if(!fin()){
			    actual.setSig(new Nodo(dato, clave, actual.getSig()));
			    if(actual == fin)
			    	fin = fin.getSig();
			}			
		}else
			System.out.println("Error, no hay datos para insertar despues..!");			
	}
	
	public void insertarOrdenado(T dato,String clavepro,String clavenom,String clave, String orden){
        int c = 0;
        if(!vacia()){
            reiniciar();
            while(!fin() && orden.compareTo(actual.getOrden())>0){
                     anterior = actual;
                     actual = actual.getSig();
             }
             if(!fin())
                insertarAntes(dato,clavepro,clavenom,clave, orden);
             else
                insertarFin(dato,clavepro,clavenom,clave, orden);
         }else
            insertarInicio(dato,clavepro,clavenom,clave, orden);
 	}
        public void insertarOrdenadoDouble(T dato,String clavepro,String clavenom,String clave, Double orden){
        int c = 0;
        if(!vacia()){
            reiniciar();
            double d1=orden;
            double d2=actual.getDou();
            while(!fin() && d1>d2){
                     anterior = actual;
                     actual = actual.getSig();
             }
             if(!fin())
                insertarAntes(dato,clavepro,clavenom,clave,orden);
             else
                insertarFin(dato,clavepro,clavenom,clave,orden);
         }else
            insertarInicio(dato,clavepro,clavenom,clave, orden);
 	}
}			   		